#ifndef LANGUE_H
#define LANGUE_H

/**
* \file Langue.h
* \brief Interface de la classe Langue
* \author Chargés de TP
* \version 0.1
* \date 16 décembre 2011
*
* Interface de la classe Langue : classe proposée pour le déroulement du TP ; les étudiants peuvent implémenter la classe Langue.cpp ou modifier l'interface.
*/

#include<map>
#include<vector>
#include<string>

class Langue {
  private :
	std::string nomLangue; // nom de la langue
	int nbMotsTotal; 	// nombre de mots total pour cette langue
	int nbTrigrammesTotal;	// nombre de trigrammes total pour cette langue
	int nbMotsTotalCorpus ; // nombre de mots total pour cette langue
	int nbTrigrammesTotalCorpus; // nombre de trigrammes total pour cette langue
	double probaMotInconnu;
	double probaTrigrammeInconnu;
	std::map <std::string, int> mapMotsOcc;	// tableau dynamique : mot (clé) et occurence (valeur)
	std::map <std::string, int> mapTrigrammesOcc; 	// tableau dynamique : trigramme (clé) et occurence (valeur)
	std::map <std::string, double> mapMotsProba;	// tableau dynamique : mot (clé) et probabilité (valeur)
	std::map <std::string, double> mapTrigrammesProba;  	// tableau dynamique : trigramme (clé) et probabilité (valeur)

	std::string getMinuscule(const std::string& mot); // Retourne le mot passé en paramètres, sous forme "lower case".

  public :
	Langue(std::string nomLangue); // Constructeur
	~Langue(); // Destructeur

	bool possede_mot(std::string); // Si la langue possède le mot
	bool possede_trigramme(std::string); // Si la langue possède le trigramme

	void ajoute_mot(std::string); // Ajout le mot à mapMotsOcc
	void ajoute_trigramme(std::string); // Ajoute le trigramme à mapTrigrammesOcc

	void incremente_nbMotsTotal(); // Incrémente nbMotsTotalCorpus
	void incremente_nbTrigrammesTotal(); // Incrémente nbTrigrammesTotalCorpus

	void incremente_motOcc(std::string); // Incrémente le nombre d'occurence de ce mot dans mapMotsOcc
	void incremente_trigrammeOcc(std::string); // Incrémente le nombre d'occurence de ce mot dans mapTrigrammesOcc


	void calcule_probabilite_trigramme(); // Calcule la probabilité pour tous les trigrammes dans mapTrigrammeproba
	void calcule_probabilite_mot(); // Calcule la probabilité pour tous les mots dans mapMotsproba

	// GET
	int get_nbMotsTotal();
	int get_nbTrigrammesTotal();
	std::string get_nomLangue();

	std::map <std::string, int> get_mapMotsOcc();
	std::map <std::string, int> get_mapTrigrammesOcc();

	double get_proba_trigramme(std::string);
	double get_proba_mot(std::string);

	double get_proba_TrigrammeInconnu(std::string); 
	double get_proba_MotInconnu(std::string);

};
#endif
